package pda.ancien;


import java.io.*;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * <h1>Classe Activite</h1>.
 * C'est une classe simple qui decrit une activite de base (id, heure e debut, heure de fin, minute de debut, minute de fin, jour, mois, annee, lieu, type de l'activite)
 * Elle definit des methodes get et set pour permettre l'interaction et une methode compareTo qui permet de comparer 2 activites entre elles
 * Elle implémente l'interface Comparable pour redéfinir la methode compareTo et elle implémente Serializable pour la sauvegarde dans un fichier.obj
 * Cette classe est la classe mère des classes Cours, Rdv et Reunion. Ces classes ont des particularites par rapport à la classe de base 
 * @author Mathieu Cornic
 * @author Camille Guerin
 * A rendre Jeudi 19 juin 2008
 */
public class Activite implements Comparable<Activite>, Serializable{
	
    private static final long serialVersionUID = 1L; //numero de version de la classe
    public static final int CHEVAUCHEMENT = 0;
    public static final int A_AVANT_B = -1;
    public static final int A_APRES_B = 1;
	
    //Variables definissant une activite
    private int id, heureDebut, heureFin, minuteDebut, minuteFin, jour, mois, annee;
    private String motif, lieu, type;
	
    /**
     * Constructeur de la classe. 
     * Il permet de definir une activite en fonction des parametres voulus.
     * Ces parametres seront utilises ensuite dans le reste de la classe
     * @param id l'identifiant de l'activite (unique)
     * @param motif le motif de l'activite
     * @param heureDebut l'heure de debut de l'activite
     * @param heureFin l'heure de fin de l'activite
     * @param minuteDebut la minute de debut de l'activite
     * @param minuteFin la minute de fin de l'activite
     * @param jour le jour de l'activite
     * @param mois le mois de l'activite (entier)
     * @param annee l'annee de l'activite
     * @param lieu le lieu de l'activite
     * @param type le type de l'activite (Rdv, Cours, Reunion, Autre)
     */
    public Activite (int id, String motif, int heureDebut, int heureFin, int minuteDebut, int minuteFin, int jour, int mois, int annee, String lieu, String type) {
		this.id = id;
		this.motif = motif;
		this.heureDebut = heureDebut;
		this.heureFin = heureFin;
		this.minuteDebut = minuteDebut;
		this.minuteFin = minuteFin;
		this.jour = jour;
		this.mois = mois;
		this.annee = annee;
		this.lieu = lieu;
		this.type = type;
    }
    //###########################Getters#############
	
    /**
     * Getter qui renvoit l'id de l'activite
     * @return l'id de l'activite
     */
    public int getId () {
	return id;
    }
	
    /**
     * Getter qui renvoit l'heure de debut de l'activite
     * @return l'heure de debut de l'activite
     */
    public int getHeureDebut () {
	return heureDebut;
    }
	
    /**
     * Getter qui renvoit l'heure de fin de l'activite
     * @return l'heure de fin de l'activite
     */
    public int getHeureFin () {
	return heureFin;
    }
	
    /**
     * Getter qui renvoit les minutes de debut de l'activite
     * @return les minutes de debut de l'activite
     */
    public int getMinuteDebut () {
	return minuteDebut;
    }
	
    /**
     * Getter qui renvoit les minutes de fin de l'activite
     * @return les minutes de fin de l'activite
     */
    public int getMinuteFin () {
	return minuteFin;
    }
	
    /**
     * Getter qui renvoit le jour de l'activite
     * @return le jour de l'activite
     */
    public int getJour () {
	return jour;
    }
	
    /**
     * Getter qui renvoit le mois de l'activite (entier)
     * @return le mois de l'activite (entier)
     */
    public int getMois () {
	return mois;
    }
	
    /**
     * Getter qui renvoit l'annee de l'activite
     * @return l'annee de l'activite
     */
    public int getAnnee () {
	return annee;
    }
	
    /**
     * Getter qui renvoit le motif de l'activite
     * @return le motif de l'activite
     */
    public String getMotif () {
	return motif;
    }
	
    /**
     * Getter qui renvoit le lieu de l'activite
     * @return le lieu de l'activite
     */
    public String getLieu () {
	return lieu;
    }
	
    /**
     * Getter qui renvoit le type de l'activite (Rdv, Cours, Reunion, Autre)
     * @return le type de l'activite
     */
    public String getType () {
	return type;
    }
	
	
    //########################  Setters  ####################
	
    /**
     * Setter qui remplace l'identifiant de l'activite par celui passe en parametre
     * @param id le nouvel identifiant
     */
    public void setId (int id) {
	this.id = id;
    }
	
    /**
     * Setter qui remplace l'heure de debut de l'activite par celle passee en parametre
     * @param heureDebut la nouvelle heure de debut
     */
    public void setHeureDebut (int heureDebut) {
	this.heureDebut = heureDebut;
    }
	
    /**
     * Setter qui remplace l'heure de fin de l'activite par celle passee en parametre
     * @param heureFin la nouvelle heure de debut
     */
    public void setHeureFin (int heureFin) {
	this.heureFin = heureFin;
    }
	
    /**
     * Setter qui remplace la minute de debut de l'activite par celle passee en parametre
     * @param minuteDebut la nouvelle minute de debut
     */
    public void setMinuteDebut (int minuteDebut) {
	this.minuteDebut = minuteDebut;
    }
	
    /**
     * Setter qui remplace la minute de fin de l'activite par celle passee en parametre
     * @param minuteFin la nouvelle minute de fin
     */
    public void setMinuteFin (int minuteFin) {
	this.minuteFin = minuteFin;
    }
	
    /**
     * Setter qui remplace le jour de l'activite par celui passe en parametre
     * @param jour le nouveau jour
     */
    public void setJour (int jour) {
	this.jour = jour;
    }
	
    /**
     * Setter qui remplace le mois de l'activite par celui passe en parametre
     * @param mois le nouveau mois
     */
    public void setMois (int mois) {
	this.mois = mois;
    }
	
    /**
     * Setter qui remplace l'annee de l'activite par celle passee en parametre
     * @param annee la nouvelle annee
     */
    public void setAnnee (int annee) {
	this.annee = annee;
    }
	
    /**
     * Setter qui remplace le motif de l'activite par celui passe en parametre
     * @param motif le nouveau motif
     */
    public void setMotif (String motif) {
	this.motif = motif;
    }
	
    /**
     * Setter qui remplace le lieu de l'activite par celui passe en parametre
     * @param lieu le nouveau lieu
     */
    public void setLieu (String lieu) {
	this.lieu = lieu;
    }
	
    /**
     * Setter qui remplace le type de l'activite par celui passe en parametre
     * @param type le nouveau type
     */
    public void setType (String type) {
		
	this.type = type;
    }
	

    /**
     * Methode qui permet de convertir dans un String, tous les parametres d'une Activite
     * @return le string contenant tous les parametres
     */
    public String toString () {
	String s =id+";"+motif+";"+heureDebut+";"+heureFin+";"+minuteDebut+";"+minuteFin+";"+jour+";"+mois+";"+annee+";"+lieu+";"+type;
	return s;
    }
	
    /**
     * Methode qui permet de comparer deux activite, et de savoir si elle se chevauche ou si l'une est avant l'autre.
     * Elle renvoit -1 si l'activite A<B, 0 si A et B se chevauche, et 1 si A>B
     * @param activite l'activite a comparer
     * @return -1 si l'activite est avant l'activite passee en parametre, 0 si elle se chevauche, 1 si l'activite est apres l'activite passee en parametre
     */
    public int compareTo (Activite activite) {
			
		Calendar cal = new GregorianCalendar ();//calendrier
			
		//on récupere dans un objet Date la date de debut de l'activite A (methode non depreciee)
		cal.set (this.annee, this.mois, this.jour, this.heureDebut, this.minuteDebut,0);
		Date thisDateDebut = cal.getTime ();
			
		//on récupere dans un objet Date la date de fin de l'activite A (methode non depreciee)
		cal.set (this.annee, this.mois, this.jour, this.heureFin, this.minuteFin,0);
		Date thisDateFin = cal.getTime ();
			
		//on récupere dans un objet Date la date de debut 'activite B (methode non depreciee)
		cal.set (activite.getAnnee (), activite.getMois (), activite.getJour (), activite.getHeureDebut (), activite.getMinuteDebut (),0);
		Date activiteDateDebut = cal.getTime ();
			
		//on récupere dans un objet Date la date de fin de l'activite B (methode non depreciee)
		cal.set (activite.getAnnee (), activite.getMois (), activite.getJour (), activite.getHeureFin (), activite.getMinuteFin (),0);
		Date activiteDateFin = cal.getTime ();
			
		//On a etudie chacun des cas du chevauchement sachant qu'on a autorisé 2 activites a se chevaucher de cette façon : A: 13h00 a 14h00, B: 14h00 a 15h00
		//pour eviter a l'utilisateur de devoir mettre 14h01 pour valider l'activite
		if (thisDateDebut.equals (activiteDateDebut) 
		   || ( (thisDateDebut.compareTo (activiteDateDebut) == A_AVANT_B) && (activiteDateDebut.compareTo (thisDateFin) == A_AVANT_B))
		   || ( activiteDateDebut.compareTo (thisDateDebut) == A_AVANT_B) && (thisDateDebut.compareTo (activiteDateFin) == A_AVANT_B)) {
			System.out.println ("activite n°"+id+" chevauche avec la n°"+activite.getId ());
				
				
			return CHEVAUCHEMENT;//on renvoit une constante de classe egale a 0

		} else if ( (thisDateFin.equals (activiteDateDebut)) || (thisDateFin.compareTo (activiteDateDebut) == A_AVANT_B) ) {
			//Sinon si l'activite A est avant B
			System.out.println ("activite n°"+id+" est avant la n°"+activite.getId ());
				
			return A_AVANT_B;//on renvoit une constante de classe egale a -1

		} else {
			//sinon
			System.out.println ("activite n°"+id+" est apres la n°"+activite.getId ());
			return A_APRES_B;//on renvoit une constante de classe egale a 1
		}
    }
	
}
